﻿<?php defined('SYSPATH') or die('No direct script access.');

class Controller_Reserva extends Controller_Restrito_Template {

	public function action_index()
	{
		$view = new View('reserva/index');
		
		$view->periodos = ORM::factory('periodo')
			->where('inicio', '>', strtotime('-1 day'))
			->and_where('fim', '<=', strtotime('+15 day'))
			->order_by('inicio')
			->find_all();
		
		$this->template->body = $view;
	}
	
	public function action_adicionarperiodo()
	{
		$view = new View('reserva/adicionarperiodo');
		
		$reserva = ORM::factory('reserva', $this->request->param('id'));
		
		if(isset($_POST['adicionar']))
		{
			$periodo = ORM::factory('periodo');
			$inicio = $periodo::geraData($_POST['data'], $_POST['horainicio']);
			$fim = $periodo::geraData($_POST['data'], $_POST['horafim']);
			
			if(! $periodo->ocorreChoque($inicio, $fim))
			{
				//$periodo = ORM::factory('periodo');
				$periodo->reserva = $reserva;
				$periodo->inicio = $inicio;
				$periodo->fim = $fim;
				if($periodo->save())
				{
					//atualiza o usuário responsável
					$reserva->usuario = ORM::factory('usuario', $this->usuario['id']);
					$reserva->save();
				
					$envioEmail = new EnvioEmail();
					$envioEmail->view = new View('reserva/email/novoperiodo');
					$envioEmail->view->reserva = $reserva;
					$envioEmail->email_responsavel = $reserva->responsavel->email;
					$envioEmail->assunto = 'Uma Reserva (Auditório-DCET1) teve seu horário alterado';
					$envioEmail->enviar();
					
					Flash::message('success', 'O Novo período foi adicionado com sucesso!');
				}
				else {
					Flash::message('error', 'Falha ao adicionar o Novo Período!');
				}
			}
			else {
				Flash::message('error', 'O Novo Período choca com um já cadastrado!');
			}
		}
		
		$view->reserva = $reserva;
		$view->periodos = $reserva->periodos->order_by('inicio')->find_all();
		
		$this->template->body = $view;
	}
	
	public function action_comprovante()
	{
		$pdf = View_PDF::factory('reserva/comprovante');
		
		$pdf->reserva = ORM::factory('reserva', $this->request->param('id'));
		
		$this->auto_render = FALSE;
		$this->response->body($pdf->render());
		$this->response->send_file(TRUE, 'auditorio-dcet1-comprovante-reserva.pdf', array('inline' => TRUE));
	}
	
	public function action_ver()
	{
		$view = new View('reserva/ver');
		
		$reserva = ORM::factory('reserva', $this->request->param('id'));
		
		$view->reserva = $reserva;
		
		$this->template->body = $view;
	}
	
	//Cronjob Envio automático de lembrete da reserva para o responsável
	public function action_lembrete()
	{
		$view = new View('reserva/lembrete');
		//busca os periodos das reservas
		$periodos = ORM::factory('periodo')
			->where('inicio', '>', strtotime('+2 days'))
			->and_where('fim', '<=', strtotime('+3 days'))
			->order_by('inicio')
			->find_all();
		
		if(isset($_REQUEST['cli'])):
		
			$view = new View('reserva/email/lembrete');
			//cronjob: não renderizar template do sistema
			$this->auto_render = FALSE;
					
			foreach($periodos as $periodo):
				if($periodo->reserva->responsavel->email):
					
					$view->reserva = $periodo->reserva;
					
					return Email::factory('Lembrete Automático da Reserva do Auditório DCET-1', $view, 'text/html')
						->to($periodo->reserva->responsavel->email)
						->from('auditoriodcet1@uneb.br', 'Auditório DCET-1')
						->send();
				endif;
			endforeach;
		endif;
		
		$this->template->body = $view;
	}
	
	public function action_buscar()
	{
		$view = new View('reserva/buscar');
		
		if(isset($_POST['buscar']))
		{
			//identifica data e hora (se houver)
			$datainicio = explode(' ', $_POST['datainicio']);
			$datafim = explode(' ', $_POST['datafim']);
			
			$view->datainicio = $_POST['datainicio'];
			$view->datafim = $_POST['datafim'];
			
			$periodo = ORM::factory('periodo');
			
			if(count($datainicio) == 2)
			{
				list($datainicio, $horainicio) = $datainicio;
				$inicio = $periodo->geraData($datainicio, $horainicio);
			}
			else {
				list($datainicio) = $datainicio;
				$inicio = $periodo->geraData($datainicio, '00:00');
			}
			
			if(count($datafim) == 2)
			{
				list($datafim, $horafim) = $datafim;
				$fim = $periodo->geraData($datafim, $horafim);
			}
			else {
				list($datafim) = $datafim;
				$fim = $periodo->geraData($datafim, '23:59');
			}
			
			//busca os periodos no banco de dados
			$periodos = ORM::factory('periodo')
				->where('inicio', '>=', $inicio)
				->and_where('fim', '<=', $fim)
				->order_by('inicio')
				->find_all();
			
			$view->periodos = $periodos;
		}
		
		$this->template->body = $view;
	}
	
	public function action_cadastrar()
	{
		if(isset($_POST['cadastrar']))
		{
			$responsavel = ORM::factory('responsavel', $_POST['responsavel']);
			if(! $responsavel->loaded())
			{
				Flash::message('error', 'O Responsável não foi informado ou é inválido');
				$this->request->redirect('reserva/index');
				exit();
			}
			
			$periodo = ORM::factory('periodo');
			//checagem de periodo valido
			$periodosvalido = true;
			$tamanho = count($_POST['datainicio']);
			//Valida todos os periodos
			for($i = 0; $i < $tamanho; $i++)
			{
				//verifica se campo preenchido
				if(
					isset($_POST['datainicio'][$i]) && $_POST['datainicio'][$i] != '' &&
					isset($_POST['horainicio'][$i]) && $_POST['horainicio'][$i] != '' &&
					isset($_POST['datafim'][$i]) && $_POST['datafim'][$i] != '' &&
					isset($_POST['horafim'][$i]) && $_POST['horafim'][$i] != ''
				)
				{
					//gera datas
					$inicio = $periodo->geraData($_POST['datainicio'][$i], $_POST['horainicio'][$i]);
					$fim = $periodo->geraData($_POST['datafim'][$i], $_POST['horafim'][$i]);
				
					//data inicio inválida
					if($inicio < strtotime('-1 hour'))
					{
						Flash::message('error', 'Você não pode cadastrar uma data anterior à data e hora atuais');
						$this->request->redirect('reserva/index');
						exit();
					}
					
					//calcula a diferenca entre as datas
					$diferenca = $fim - $inicio;
				
					//verificar se o período é válido
					if($diferenca < 0)
					{
						//periodo inválido
						Flash::message('error', 'Você não pode cadastrar uma data final anterior à data inicial('.$_POST['datainicio'].')');
						$this->request->redirect('reserva/index');
					}
					
					//verificar se o dia final é igual ao inicial
					if($_POST['datainicio'][$i] == $_POST['datafim'][$i])
					{
						//inclui e vai para o proximo
						if(! $periodo->ocorreChoque($inicio, $fim))
						{
							$periodos[] = array('inicio' => $inicio, 'fim' => $fim);
							continue;
						}
						else {
							Flash::message('error', 'Existe um período que choca com um já existente: '.date('d/m/Y H:i', $inicio).' às '.date('d/m/Y H:i', $fim));
							$periodosvalido = false;
							break;
						}
					}
					
					//verifica a quantidade de dias de diferença
					$dias = date('j', $diferenca);
						
					//periodo com dias de diferença
					if($dias > 0)
					{
						//trata o intervalo de dias como vários periodos
						for($j = 0; $j < $dias; $j++)
						{
							//acrescenta X dias à data
							$inicioNovo = strtotime('+'.$j.' days', $inicio);
							$fimNovo = $periodo->geraData(date('d/m/Y', $inicioNovo), $_POST['horafim'][$i]);
							
							if(! $periodo->ocorreChoque($inicioNovo, $fimNovo))
							{
								$periodos[] = array('inicio' => $inicioNovo, 'fim' => $fimNovo);
								continue;
							}
							else {
								Flash::message('error', 'Existe um período que choca com um já existente: '.date('d/m/Y H:i', $inicio).' às '.date('d/m/Y H:i', $fim));
								$periodosvalido = false;
								break;
							}
						}
					}
					
				}
			}
			
			if($periodosvalido)
			{
				//salvar reserva
				$reserva = ORM::factory('reserva');
				$reserva->atividade = $_POST['atividade'];
				$reserva->responsavel = $responsavel;
				$reserva->usuario = ORM::factory('usuario', $this->usuario['id']);
				$reserva->datacadastro = time();
				
				if($reserva->save())
				{
					foreach($periodos as $periodo):
						$periodoM = ORM::factory('periodo');
						$periodoM->reserva = $reserva;
						$periodoM->inicio = $periodo['inicio'];
						$periodoM->fim = $periodo['fim'];
						$periodoM->save();
					endforeach;
				}
				else {
					Flash::message('error', 'Ocorreu uma falha ao criar a reserva!');
					$this->request->redirect('calendario/index');
				}
				
				$envioEmail = new EnvioEmail();
				$envioEmail->view = new View('reserva/email/novareserva');
				$envioEmail->view->reserva = $reserva;
				$envioEmail->view->responsavel = $reserva->responsavel;
				$envioEmail->email_responsavel = $reserva->responsavel->email;
				$envioEmail->assunto = 'Nova Reserva do Auditório-DCET1';
				$envioEmail->enviar();
				
				Flash::message('success', 'A reserva foi feita com sucesso! Os responsáveis receberam um email de confirmação!');
			}
		}
	
		$view = new View('reserva/cadastrar');
		
		$responsaveis = ORM::factory('responsavel')
			->order_by('nome')
			->find_all();
		
		$view->bind_global('responsaveis', $responsaveis);
		
		$view->periodos = ORM::factory('periodo')
			->where('inicio', '>', strtotime('-1 Days'))
			->and_where('fim', '<=', strtotime('+15 Days'))
			->order_by('inicio')
			->find_all();
		
		$this->template->body = $view;
	}
	
	public function action_editar()
	{
		$view = new View('reserva/editar');
		
		$reserva = ORM::factory('reserva', $this->request->param('id'));
		
		if(isset($_POST['editar']))
		{
			$reserva->responsavel = ORM::factory('responsavel', $_POST['responsavel']);
			$reserva->atividade = $_POST['atividade'];
			$reserva->usuario = ORM::factory('usuario', $this->usuario['id']);
			$reserva->datacadastro = time();
			
			if($reserva->save())
			{
				
				$envioEmail = new EnvioEmail();
				$envioEmail->view = new View('reserva/email/reservaalterada');
				$envioEmail->view->reserva = $reserva;
				$envioEmail->view->responsavel = $reserva->responsavel;
				$envioEmail->email_responsavel = $reserva->responsavel->email;
				$envioEmail->assunto = 'Alteração dos dados da Reserva do Auditório-DCET1';
				$envioEmail->enviar();
				
				Flash::message('success', 'A reserva foi alterada com sucesso! Os responsáveis receberam um email de confirmação!');
			}
		}
		
		$view->reserva = $reserva;
		$view->responsaveis = ORM::factory('responsavel')->find_all();
		$view->periodos = $reserva->periodos
			->where('inicio', '>', strtotime('-1 Days'))
			->and_where('fim', '<=', strtotime('+15 Days'))
			->order_by('inicio')
			->find_all();
		
		$this->template->usuario = $this->usuario;
		$this->template->body = $view;
	}
	
	
	public function action_apagar()
	{
		$reserva = ORM::factory('reserva', $this->request->param('id'));
		
		if($reserva->loaded())
		{
			//periodos que serão cancelados
			$periodos = $reserva->periodos->find_all();
			
			//cria uma copia dos dados
			$reserva_aux = array(
				'reserva' => clone $reserva,
				'responsavel' => clone $reserva->responsavel,
				'periodos' => clone $periodos,
				'usuario' => $reserva->usuario->usuario,
				'email' => $reserva->responsavel->email,
			);
			
			//apaga os periodos
			foreach($periodos as $periodo):
				$periodo->delete();
			endforeach;
			
			//apaga as reservas
			if($reserva->delete())
			{
				$envioEmail = new EnvioEmail();
				$envioEmail->view = new View('reserva/email/reservacancelada');
				$envioEmail->view->reserva = $reserva_aux;
				$envioEmail->email_responsavel = $reserva_aux['email'];
				$envioEmail->assunto = 'Uma Reserva do Auditório-DCET1 foi cancelada';
				$envioEmail->enviar();
				
				Flash::message('success', 'A Reserva foi cancelada com sucesso!');
			}
			else {
				Flash::message('error', 'Ocorreu um erro ao cancelar a Reserva!');
			}
		}
		else {
			Flash::message('error', 'A  Reserva informada é inválida!');
		}
	
		$this->request->redirect('calendario/index');
	}
	
} // End Reserva
